#include "TestIndiceSecuencial.h"

#include "includes.h"
#include "../src/estrategiaRecurso/Almacenamiento.h"
#include "../src/indices/IndiceSecuencial.h"
#include "TipoClaveChar.h"
#include "../src/recursoDeAlmacenamiento/FabricaRecursosAlmacenamiento.h"
#include "../src/estrategiaAlmacenamiento/Iterador.h"
#include "../src/recursoDeAlmacenamiento/RecursoDeAlmacenamientoIndexado.h"

TestIndiceSecuencial::TestIndiceSecuencial() {

	string pathRecurso = "./Archivos/secuencialdatos";
	string pathIndice = "./Archivos/indicesecuencial";
	system("rm ./Archivos/secuencialdatos*");
	system("rm ./Archivos/indicesecuencial*");

	IndiceSecuencial* indice = new IndiceSecuencial(new TipoClaveChar, pathIndice);
	int tamanioBloque = 15;
	this->recurso = FabricaRecursosAlmacenamiento::getFabrica()->crearRecursoIndexadoBloques
			(pathRecurso, tamanioBloque, indice,DIFERIDA,FABRICA_BLOQUES_COMPRIMIDOS);
}

TestIndiceSecuencial::~TestIndiceSecuencial() {
	delete recurso;
}

void TestIndiceSecuencial::run() {

	TipoClaveChar extractor;

	Bytes dato1("Chaja");
	Bytes dato2("Chaco");
	Bytes dato3("Spi");
	Bytes dato4("Rodrix");
	Bytes dato5("Bizarro");

	recurso->guardar(dato1);
	recurso->guardar(dato2);
	recurso->guardar(dato3);
	recurso->guardar(dato4);

	Key spiKey = extractor.crearClave(extractor.extraerClave(dato3));
	Bytes res1 = recurso->cargar(spiKey);
	Bytes res2 = recurso->cargar(extractor.crearClave(extractor.extraerClave(dato4)));

	assert (res1.toString() == dato3.toString(), "Testeando cargar Spi (" + res1.toString() + ")" );
	assert (res2.toString() == dato4.toString(), "Testeando cargar Rodrix(" + res2.toString() + ")" );

	assert(recurso->eliminar(spiKey), "Testeando eliminar Spi");
	assert(!recurso->eliminar(spiKey), "Testeando eliminar Spi cuando ya esta eliminado");

	recurso->guardar(dato5);

	Iterador* it = recurso->getIterador();

	while (it->tieneSiguiente()) {
		cout << it->getSiguiente().toString() << endl;
	}
	cout << endl;

	delete it;
}
